package com.locus.locus.server.dados;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.locus.locus.client.dados.EstabelecimentoWrapper;
import com.locus.locus.client.dados.LocalizacaoWrapper;
import com.locus.locus.client.dados.UsuarioLocusWrapper;

@PersistenceCapable
public class Estabelecimento implements Wrappable<EstabelecimentoWrapper>{
	
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Key key;
	@Persistent
	private String nome;
	@Persistent
	private String nomeSite;
	@Persistent
	private String idTwitter;
	@Persistent
	private String urlSite;
	@Persistent
	private String informacoes;
	@Persistent
	private long idUltimoTweet;
	@Persistent
	private Date ultimaAtualizacao;

	private transient List<Localizacao> localizacoes;
	
	@Persistent
	private List<Key> chavesAdministradores;
	private transient List<UsuarioLocus> administradores;
	
	public Estabelecimento() {	}
	
	public Estabelecimento(EstabelecimentoWrapper wrapper) {
		final List<UsuarioLocusWrapper> administradoresWrapper = wrapper.getAdministradores();
		UsuarioLocus administrador;
		
		this.nome = wrapper.getNome();
		this.nomeSite = wrapper.getNomeSite();
		this.idTwitter = wrapper.getIdTwitter();
		this.administradores = new ArrayList<UsuarioLocus>();
		this.chavesAdministradores = new ArrayList<Key>();
		this.informacoes = wrapper.getInformacoes();
		this.localizacoes = new ArrayList<Localizacao>(wrapper.getLocalizacoes().size());
		for(LocalizacaoWrapper localizacao:wrapper.getLocalizacoes()){
			this.localizacoes.add(new Localizacao(localizacao));
		}
		
		this.idUltimoTweet = 1;
		this.ultimaAtualizacao = new Date();
		
		this.urlSite = wrapper.getUrlSite();
		
		String chave = wrapper.getChave();
		if(chave != null){
			this.key = KeyFactory.stringToKey(chave);
		}

		if(administradoresWrapper != null){
			for(UsuarioLocusWrapper usuario:administradoresWrapper){
				administrador = new UsuarioLocus(usuario);
				this.administradores.add(administrador);
				this.chavesAdministradores.add(administrador.getKey());
			}
		}
	}
	
	public Key getKey() {
		return key;
	}
	public void setKey(Key key) {
		this.key = key;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getNomeSite() {
		return nomeSite;
	}
	public void setNomeSite(String nomeSite) {
		this.nomeSite = nomeSite;
	}
	public String getIdTwitter() {
		return idTwitter;
	}
	public void setIdTwitter(String idTwitter) {
		this.idTwitter = idTwitter;
	}
	public String getUrlSite() {
		return urlSite;
	}
	public void setUrlSite(String urlSite) {
		this.urlSite = urlSite;
	}
	public String getInformacoes() {
		return informacoes;
	}
	public void setInformacoes(String informacoes) {
		this.informacoes = informacoes;
	}
	public List<Key> getChavesAdministradores() {
		return chavesAdministradores;
	}
	public void setChavesAdministradores(List<Key> chavesAdministradores) {
		this.chavesAdministradores = chavesAdministradores;
	}
	public List<UsuarioLocus> getAdministradores() {
		return administradores;
	}
	public void setAdministradores(List<UsuarioLocus> administradores) {
		this.administradores = administradores;
	}
	public long getIdUltimoTweet() {
		return idUltimoTweet;
	}
	public void setIdUltimoTweet(long idUltimoTweet) {
		this.idUltimoTweet = idUltimoTweet;
	}
	public Date getUltimaAtualizacao() {
		return ultimaAtualizacao;
	}
	public void setUltimaAtualizacao(Date ultimaAtualizacao) {
		this.ultimaAtualizacao = ultimaAtualizacao;
	}
	public List<Localizacao> getLocalizacoes() {
		return this.localizacoes;
	}
	public void setLocalizacoes(List<Localizacao> localizacao) {
		this.localizacoes = localizacao;
	}

	@Override
	public EstabelecimentoWrapper gerarWrapper() {
		final EstabelecimentoWrapper wrapper = new EstabelecimentoWrapper();
		final ArrayList<UsuarioLocusWrapper> adminsWrappers;
		final ArrayList<LocalizacaoWrapper> localizacoes = new ArrayList<LocalizacaoWrapper>(this.localizacoes.size());
		
		if(this.key != null){
			wrapper.setChave(KeyFactory.keyToString(this.key));
		}
		wrapper.setNome(this.nome);
		wrapper.setNomeSite(this.nomeSite);
		wrapper.setIdTwitter(this.idTwitter);
		wrapper.setUrlSite(this.urlSite);
		wrapper.setInformacoes(this.informacoes);
		wrapper.setLocalizacoes(localizacoes);
		for(Localizacao localizacao:this.localizacoes){
			localizacoes.add(localizacao.gerarWrapper());
		}
		if(this.administradores != null){
			adminsWrappers = new ArrayList<UsuarioLocusWrapper>(this.administradores.size());
			for(UsuarioLocus usuario:this.administradores){
				adminsWrappers.add(usuario.gerarWrapper());
			}
		}else{
			adminsWrappers = new ArrayList<UsuarioLocusWrapper>(0);
		}
		wrapper.setAdministradores(adminsWrappers);
		
		return wrapper;
	}

	@Override
	public void deserializarRelacionamentos(PersistenceManager pm) {
		this.localizacoes = new ArrayList<Localizacao>((List<Localizacao>) pm.newQuery(Localizacao.class, "estabelecimento == :p").execute(this.key));			
		if(!this.chavesAdministradores.isEmpty()){
			this.administradores = new ArrayList<UsuarioLocus>((List<UsuarioLocus>) pm.newQuery(UsuarioLocus.class, ":p.contains(key)").execute(this.chavesAdministradores));
		}		
	}
}